package co.yixiang.utils;

import cn.hutool.crypto.SecureUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FuseCloudSmsUtil {

    private static final String username = "yxwh";//用户名
    private static final String password = "YGIDFG3V";//密码

    private static final String signReportUrl = "https://api.mix2.zthysms.com/sms/v1/sign";//短信签名报备url
    private static final String searchSignReport = "https://api.mix2.zthysms.com/sms/v1/sign/query";//查询短信签名报备url
    private static final String templateReport = "https://api.mix2.zthysms.com/sms/v2/template";//短信模板报备url
    private static final String templateReportList = "https://api.mix2.zthysms.com/sms/v2/template/list";//短信模板报备List
    private static final String delTemplateReport = "https://api.mix2.zthysms.com/sms/v2/template/delete";//短信模板报备List
    private static final String sendSmsTp = "https://api.mix2.zthysms.com/v2/sendSmsTp";//模板签名短信
    private static final String sendSms = "https://api.mix2.zthysms.com/v2/sendSms";//自定义短信模板

    public static final String sign = "【艺轩文化】";

    /**
     * 短信签名报备
     * @param sign 签名必须带中文中括号【】
     *
     * @return String
     */
    public static String signReport(List<String> stringList) throws IOException {
        JSONObject params = createParams();
        params.put("sign" , stringList);
        String s = HttpUtils.sendPost(signReportUrl, params, "UTF-8");
        return s;
    }


    /**
     * 查询短信签名报备
     * @param sign 签名必须带中文中括号【】
     *
     * @return String
     */
    public static String searchSignReport(String sign) throws IOException {
        JSONObject params = createParams();
        params.put("sign" , sign);
        String s = HttpUtils.sendPost(searchSignReport, params, "UTF-8");
        return s;
    }


    /**
     * 模板报备
     * @param temName 模板名称 ( 最大20字符)
     * @param temType 模板类型  1 -  验证码    2 - 行业通知  3 - 营销推广
     * @param temContent 模板内容 （最大450字符）,支持变量参数。 举例：尊敬的{name}，您购买的是{goods}。
     * @param paramJson 验证码    valid_code	4-6位纯数字
     *                  手机号	mobile_number	1-15位纯数字
     *                  其他号码	other_number	1-32位字母+数字组合,支持中划线-
     *                  金额	amount	支持数字或数字的中文 （壹贰叁肆伍陆柒捌玖拾佰仟万亿 圆元整角分厘毫）
     *                  日期	date	符合时间的表达方式 也支持中文：2019年9月3日16时24分35秒
     *                  中文	chinese	1-32中文，支持中文圆括号（）
     *                  其他	others。
     *
     * @return String
     * @throws IOException
     */
    public static String templateReport(String temName , Integer temType , String temContent , String paramJson ) throws IOException {
        JSONObject params = createParams();
        params.put("temName" , temName);
        params.put("temType" , temType);
        params.put("temContent" , temContent);
        if (null != paramJson && "" != paramJson){
            JSONObject param = new JSONObject();
            param.put("code" , paramJson);
            params.put("paramJson", param);
        }
        System.out.println(params);
        String s = HttpUtils.sendPost(templateReport, params, "UTF-8");
        return s;
    }

    /**
     * 模板报备
     * @param status  审核状态 （1.待审核 2.审核通过 3.审核不通过）
     * @param page 当前页,默认从1开始
     * @param size 每页数量，默认10，最大100
     *
     * @return String
     * @throws IOException
     */
    public static String templateReportList(Integer status , Integer page , Integer size) throws IOException {
        JSONObject params = createParams();
        params.put("status" , status);
        params.put("page" , page);
        params.put("size" , size);
        String s = HttpUtils.sendPost(templateReportList, params, "UTF-8");
        return s;
    }

    /**
     * 删除模板报备
     * @param temId  短信模板
     *
     * @return String
     * @throws IOException
     */
    public static String delTemplateReport(Long temId) throws IOException {
        JSONObject params = createParams();
        params.put("temId" , temId);
        String s = HttpUtils.sendPost(delTemplateReport, params, "UTF-8");
        return s;
    }

    /**
     * 发送模板短信 || 验证码
     * @param signature  短信签名
     * @param temId  短信模板
     * @param mobile  手机号
     * @param code  验证码
     *
     * @return String
     * @throws IOException
     */
    public static String sendTemSms(String signature , Long temId , String mobile ,String code) throws IOException {
        JSONObject params = createParams();
        params.put("signature" , signature);
        params.put("tpId" , String.valueOf(temId));
        //封装
        JSONArray records = new JSONArray();
        JSONObject record = new JSONObject();
        record.put("mobile", mobile);
        JSONObject param = new JSONObject();
        param.put("code", code);
        record.put("tpContent", param);
        records.add(record);
        params.put("records", records);

        System.out.println(params);
        String s = HttpUtils.sendPost(sendSmsTp, params, "UTF-8");
        return s;
    }

    /**
     * 发送自定义短信
     * @param mobile  手机号
     * @param content  短信内容，最多支持1000个字符，例：【签名A】短信内容。
     *
     * @return String
     * @throws IOException
     */
    public static String sendSms(String mobile ,String content) throws IOException {
        JSONObject params = createParams();
        params.put("content" , content);
        params.put("mobile", mobile);

        String s = HttpUtils.sendPost(sendSms, params, "UTF-8");
        System.out.println(s);
        return s;
    }


    /**
     * 密码md5加密 密码采用32位小写MD5二次加密，例：md5 ( md5( password ) + tKey ))
     * @return Long
     */
    private static String Md5Password(String password , Long tKey){
        return SecureUtil.md5(SecureUtil.md5(password) + tKey);
    }

    /**
     * 创建参数
     * @return Long
     */
    private static JSONObject createParams(){
        Long tKey = System.currentTimeMillis() / 1000;
        JSONObject params = new JSONObject();
        params.put("username" , username);
        params.put("password" , Md5Password(password , tKey));
        params.put("tKey" , String.valueOf(tKey));

        return params;
    }


    public static void main(String[] args) throws IOException {

        // 1、短信报备
//        List<String> strings = new ArrayList<>();
//        strings.add("【艺轩文化】");
//        System.out.println(signReport(strings));

        // 2、查询报备结果 {"code":200,"msg":"success","sign":"【翰墨轩】","auditResult":1,"auditMsg":"待审核"}
//        System.out.println(searchSignReport("【艺轩文化】"));

        // 3、模板报备 {"code":200,"msg":"success","temId":"38119","extend":null}  temId:模板号
//        System.out.println(templateReport("通用验证码1", 1, "【软云科技】您的验证码是{code}。如非本人操作，请忽略本短信!" , "valid_code"));

        // 4、删除短信模板 {"code":200,"msg":"success","temId":38114}
//        System.out.println(delTemplateReport(38114L));

        // 5、查看短信模板List {"code":200,"msg":"success","page":{"total":1,"size":100,"currentPage":1,"totalPage":1},"templates":[{"temId":38109,"temName":"通用验证码","temType":1,"temContent":"您的验证码是{code}。如非本人操作，请忽略本短信!","extend":null,"paramJson":null,"createTime":"2021-07-06 16:41:21","updateTime":"2021-07-06 16:41:21","remark":null,"auditResult":1,"auditMsg":"待审核","skipParamCheck":false}]}
//        System.out.println(templateReportList(null , 1 , 100));

        // 6、根据签名和模板号 发送短信
//        System.out.println(sendTemSms("【软云科技】" , 38119L , "17333239461" , "123456"));

        // 7、自定义短信
        System.out.println(sendSms("15555820209" , "【艺轩文化】您的验证码是123456。如非本人操作，请忽略本短信!"));

    }

}
